<!DOCTYPE html>
<html lang="en-us">
  <head>

    <meta http-equiv="content-type" content="text/html; charset=utf-8">
    
<meta charset="UTF-8">
<title>Expand or contract | Elasticsearch: The Definitive Guide [2.x] | Elastic</title>
<link rel="home" href="index.html" title="Elasticsearch: The Definitive Guide [2.x]">
<link rel="up" href="synonyms.html" title="Synonyms">
<link rel="prev" href="synonym-formats.html" title="Formatting Synonyms">
<link rel="next" href="synonyms-analysis-chain.html" title="Synonyms and The Analysis Chain">
<meta name="DC.type" content="Learn/Docs/Legacy/Elasticsearch/Definitive Guide/2.x">
<meta name="DC.subject" content="Elasticsearch">
<meta name="DC.identifier" content="2.x">
<meta name="robots" content="noindex,nofollow">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <script src="https://cdn.optimizely.com/js/18132920325.js"></script>
    <link rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png">
    <link rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png">
    <link rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png">
    <link rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png">
    <link rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png">
    <link rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png">
    <link rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png">
    <link rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png">
    <link rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png">
    <link rel="icon" type="image/png" href="/favicon-32x32.png" sizes="32x32">
    <link rel="icon" type="image/png" href="/android-chrome-192x192.png" sizes="192x192">
    <link rel="icon" type="image/png" href="/favicon-96x96.png" sizes="96x96">
    <link rel="icon" type="image/png" href="/favicon-16x16.png" sizes="16x16">
    <link rel="manifest" href="/manifest.json">
    <meta name="apple-mobile-web-app-title" content="Elastic">
    <meta name="application-name" content="Elastic">
    <meta name="msapplication-TileColor" content="#ffffff">
    <meta name="msapplication-TileImage" content="/mstile-144x144.png">
    <meta name="theme-color" content="#ffffff">
    <meta name="naver-site-verification" content="936882c1853b701b3cef3721758d80535413dbfd">
    <meta name="yandex-verification" content="d8a47e95d0972434">
    <meta name="localized" content="true">
    <meta name="st:robots" content="follow,index">
    <meta property="og:image" content="https://www.elastic.co/static/images/elastic-logo-200.png">
    <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">
    <link rel="icon" href="/favicon.ico" type="image/x-icon">
    <link rel="apple-touch-icon-precomposed" sizes="64x64" href="/favicon_64x64_16bit.png">
    <link rel="apple-touch-icon-precomposed" sizes="32x32" href="/favicon_32x32.png">
    <link rel="apple-touch-icon-precomposed" sizes="16x16" href="/favicon_16x16.png">
    <!-- Give IE8 a fighting chance -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
    <link rel="stylesheet" type="text/css" href="/guide/static/styles.css">
  </head>

  <!--© 2015-2021 Elasticsearch B.V. Copying, publishing and/or distributing without written permission is strictly prohibited.-->

  <body>
    <!-- Google Tag Manager -->
    <script>dataLayer = [];</script><noscript><iframe src="//www.googletagmanager.com/ns.html?id=GTM-58RLH5" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
    <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= '//www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-58RLH5');</script>
    <!-- End Google Tag Manager -->

    <!-- Global site tag (gtag.js) - Google Analytics -->
    <script async src="https://www.googletagmanager.com/gtag/js?id=UA-12395217-16"></script>
    <script>
      window.dataLayer = window.dataLayer || [];
      function gtag(){dataLayer.push(arguments);}
      gtag('js', new Date());
      gtag('config', 'UA-12395217-16');
    </script>

    <!--BEGIN QUALTRICS WEBSITE FEEDBACK SNIPPET-->
    <script type="text/javascript">
      (function(){var g=function(e,h,f,g){
      this.get=function(a){for(var a=a+"=",c=document.cookie.split(";"),b=0,e=c.length;b<e;b++){for(var d=c[b];" "==d.charAt(0);)d=d.substring(1,d.length);if(0==d.indexOf(a))return d.substring(a.length,d.length)}return null};
      this.set=function(a,c){var b="",b=new Date;b.setTime(b.getTime()+6048E5);b="; expires="+b.toGMTString();document.cookie=a+"="+c+b+"; path=/; "};
      this.check=function(){var a=this.get(f);if(a)a=a.split(":");else if(100!=e)"v"==h&&(e=Math.random()>=e/100?0:100),a=[h,e,0],this.set(f,a.join(":"));else return!0;var c=a[1];if(100==c)return!0;switch(a[0]){case "v":return!1;case "r":return c=a[2]%Math.floor(100/c),a[2]++,this.set(f,a.join(":")),!c}return!0};
      this.go=function(){if(this.check()){var a=document.createElement("script");a.type="text/javascript";a.src=g;document.body&&document.body.appendChild(a)}};
      this.start=function(){var a=this;window.addEventListener?window.addEventListener("load",function(){a.go()},!1):window.attachEvent&&window.attachEvent("onload",function(){a.go()})}};
      try{(new g(100,"r","QSI_S_ZN_emkP0oSe9Qrn7kF","https://znemkp0ose9qrn7kf-elastic.siteintercept.qualtrics.com/WRSiteInterceptEngine/?Q_ZID=ZN_emkP0oSe9Qrn7kF")).start()}catch(i){}})();
    </script><div id="ZN_emkP0oSe9Qrn7kF"><!--DO NOT REMOVE-CONTENTS PLACED HERE--></div>
    <!--END WEBSITE FEEDBACK SNIPPET-->

    <div id="elastic-nav" style="display:none;"></div>
    <script src="https://www.elastic.co/elastic-nav.js"></script>

    <!-- Subnav -->
    <div>
      <div>
        <div class="tertiary-nav d-none d-md-block">
          <div class="container">
            <div class="p-t-b-15 d-flex justify-content-between nav-container">
              <div class="breadcrum-wrapper"><span><a href="/guide/" style="font-size: 14px; font-weight: 600; color: #000;">Docs</a></span></div>
            </div>
          </div>
        </div>
      </div>
    </div>

    <div class="main-container">
      <section id="content">
        <div class="content-wrapper">

          <section id="guide" lang="en">
            <div class="container">
              <div class="row">
                <div class="col-xs-12 col-sm-8 col-md-8 guide-section">
                  <!-- start body -->
                  <div class="page_header">
<p>
  <strong>WARNING</strong>: The 2.x versions of Elasticsearch have passed their
  <a href="https://www.elastic.co/support/eol">EOL dates</a>. If you are running
  a 2.x version, we strongly advise you to upgrade.
</p>
<p>
  This documentation is no longer maintained and may be removed. For the latest
  information, see the <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html">current
  Elasticsearch documentation</a>.
</p>
</div>
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="index.html">Elasticsearch: The Definitive Guide [2.x]</a></span>
»
<span class="breadcrumb-link"><a href="languages.html">Dealing with Human Language</a></span>
»
<span class="breadcrumb-link"><a href="synonyms.html">Synonyms</a></span>
»
<span class="breadcrumb-node">Expand or contract</span>
</div>
<div class="navheader">
<span class="prev">
<a href="synonym-formats.html">« Formatting Synonyms</a>
</span>
<span class="next">
<a href="synonyms-analysis-chain.html">Synonyms and The Analysis Chain »</a>
</span>
</div>
<div class="section">
<div class="titlepage"><div><div>
<h2 class="title">
<a id="synonyms-expand-or-contract"></a>Expand or contract<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch-definitive-guide/edit/2.x/260_Synonyms/40_Expand_contract.asciidoc">edit</a>
</h2>
</div></div></div>
<p>In <a class="xref" href="synonym-formats.html" title="Formatting Synonyms">Formatting Synonyms</a>, we have seen that it is possible to replace synonyms by
<em>simple expansion</em>, <em>simple contraction</em>, or <em>generic expansion</em>.  We will look
at the trade-offs of each of these techniques in this section.</p>
<div class="tip admon">
<div class="icon"></div>
<div class="admon_content">
<p>This section deals with single-word synonyms only.  Multiword
synonyms add another layer of complexity and are discussed later in
<a class="xref" href="multi-word-synonyms.html" title="Multiword Synonyms and Phrase Queries">Multiword Synonyms and Phrase Queries</a>.</p>
</div>
</div>
<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="synonyms-expansion"></a>Simple Expansion<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch-definitive-guide/edit/2.x/260_Synonyms/40_Expand_contract.asciidoc">edit</a>
</h3>
</div></div></div>
<p>With <em>simple expansion</em>, any of the listed synonyms is expanded into <em>all</em> of
the listed synonyms:</p>
<pre class="literallayout">"jump,hop,leap"</pre>

<p>Expansion can be applied either at index time or at query time.  Each has advantages
(⬆)︎ and disadvantages (⬇)︎. When to use which comes down to performance versus
flexibility.</p>
<div class="informaltable">
<table border="1" cellpadding="4px">
<colgroup>
<col class="col_1">
<col class="col_2">
<col class="col_3">
</colgroup>
<thead>
<tr>
<th align="left" valign="top"></th>
<th align="left" valign="top">Index time</th>
<th align="left" valign="top">Query time</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left" valign="top"><p><span class="strong strong"><strong>Index size</strong></span></p></td>
<td align="left" valign="top"><p>⬇︎ Bigger index because all synonyms must be indexed.</p></td>
<td align="left" valign="top"><p>⬆︎ Normal.</p></td>
</tr>
<tr>
<td align="left" valign="top"><p><span class="strong strong"><strong>Relevance</strong></span></p></td>
<td align="left" valign="top"><p>⬇︎ All synonyms will have the same IDF (see <a class="xref" href="relevance-intro.html" title="What Is Relevance?">What Is Relevance?</a>), meaning
      that more commonly used words will have the same weight as less commonly
      used words.</p></td>
<td align="left" valign="top"><p>⬆︎ The IDF for each synonym will be correct.</p></td>
</tr>
<tr>
<td align="left" valign="top"><p><span class="strong strong"><strong>Performance</strong></span></p></td>
<td align="left" valign="top"><p>⬆︎ A query needs to find only the single term specified in the query string.</p></td>
<td align="left" valign="top"><p>⬇︎ A query for a single term is rewritten to look up all synonyms, which
      decreases performance.</p></td>
</tr>
<tr>
<td align="left" valign="top"><p><span class="strong strong"><strong>Flexibility</strong></span></p></td>
<td align="left" valign="top"><p>⬇︎ The synonym rules can’t be changed for existing documents. For the new rules
      to have effect, existing documents have to be reindexed.</p></td>
<td align="left" valign="top"><p>⬆︎ Synonym rules can be updated without reindexing documents.</p></td>
</tr>
</tbody>
</table>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="synonyms-contraction"></a>Simple Contraction<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch-definitive-guide/edit/2.x/260_Synonyms/40_Expand_contract.asciidoc">edit</a>
</h3>
</div></div></div>
<p><em>Simple contraction</em> maps a group of synonyms on the left side to a single
value on the right side:</p>
<pre class="literallayout">"leap,hop =&gt; jump"</pre>

<p>It must be applied both at index time and at query time, to ensure that query
terms are mapped to the same single value that exists in the index.</p>
<p>This approach has some advantages and some disadvantages compared to the simple expansion approach:</p>
<div class="variablelist">
<dl class="variablelist">
<dt>
<span class="term">
Index size
</span>
</dt>
<dd>
⬆︎ The index size is normal, as only a single term is indexed.
</dd>
<dt>
<span class="term">
Relevance
</span>
</dt>
<dd>
⬇︎ The IDF for all terms is the same, so you can’t distinguish between more
commonly used words and less commonly used words.
</dd>
<dt>
<span class="term">
Performance
</span>
</dt>
<dd>
⬆︎ A query needs to find only the single term that appears in the index.
</dd>
<dt>
<span class="term">
Flexibility
</span>
</dt>
<dd>
<p>⬆︎ New synonyms can be added to the left side of the rule and applied at
query time. For instance, imagine that we wanted to add the word <code class="literal">bound</code> to
the rule specified previously. The following rule would work for queries that
contain <code class="literal">bound</code> or for newly added documents that contain <code class="literal">bound</code>:</p>
<pre class="literallayout">"leap,hop,bound =&gt; jump"</pre>

<p>But we could expand the effect to also take into account <em>existing</em> documents
that contain <code class="literal">bound</code> by writing the rule as follows:</p>
<pre class="literallayout">"leap,hop,bound =&gt; jump,bound"</pre>

<p>When you reindex your documents, you could revert to the previous rule to gain
the performance benefit of querying only a single term.</p>
</dd>
</dl>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="synonyms-genres"></a>Genre Expansion<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch-definitive-guide/edit/2.x/260_Synonyms/40_Expand_contract.asciidoc">edit</a>
</h3>
</div></div></div>
<p>Genre expansion is quite different from simple contraction or expansion.
Instead of treating all synonyms as equal, genre expansion widens the meaning
of a term to be more generic. Take these rules, for example:</p>
<pre class="literallayout">"cat    =&gt; cat,pet",
"kitten =&gt; kitten,cat,pet",
"dog    =&gt; dog,pet"
"puppy  =&gt; puppy,dog,pet"</pre>

<p>By applying genre expansion at index time:</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
A query for <code class="literal">kitten</code> would find just documents about kittens.
</li>
<li class="listitem">
A query for <code class="literal">cat</code> would find documents abouts kittens and cats.
</li>
<li class="listitem">
A query for <code class="literal">pet</code> would find documents about kittens, cats, puppies, dogs,
or pets.
</li>
</ul>
</div>
<p>Alternatively, by applying genre expansion at query time, a query for <code class="literal">kitten</code>
would be expanded to return documents that mention kittens, cats, or pets
specifically.</p>
<p>You could also have the best of both worlds by applying expansion at index
time to ensure that the genres are present in the index. Then, at query time,
you can choose to not apply synonyms (so that a query for <code class="literal">kitten</code>
returns only documents about kittens) or to apply synonyms in order to match
kittens, cats and pets (including the canine variety).</p>
<p>With the preceding example rules above, the IDF for <code class="literal">kitten</code> will be correct, while the
IDF for <code class="literal">cat</code> and <code class="literal">pet</code> will be artificially deflated.  However, this
works in your favor—​a genre-expanded query for <code class="literal">kitten OR cat OR pet</code> will
rank documents with <code class="literal">kitten</code> highest, followed by documents with <code class="literal">cat</code>, and
documents with <code class="literal">pet</code> would be right at the bottom.</p>
</div>

</div>
<div class="navfooter">
<span class="prev">
<a href="synonym-formats.html">« Formatting Synonyms</a>
</span>
<span class="next">
<a href="synonyms-analysis-chain.html">Synonyms and The Analysis Chain »</a>
</span>
</div>
</div>

                  <!-- end body -->
                </div>
                <div class="col-xs-12 col-sm-4 col-md-4" id="right_col">
                  <div id="rtpcontainer" style="display: block;">
                    <div class="mktg-promo">
                      <h3>Most Popular</h3>
                      <ul class="icons">
                        <li class="icon-elasticsearch-white"><a href="https://www.elastic.co/webinars/getting-started-elasticsearch?baymax=default&amp;elektra=docs&amp;storm=top-video">Get Started with Elasticsearch: Video</a></li>
                        <li class="icon-kibana-white"><a href="https://www.elastic.co/webinars/getting-started-kibana?baymax=default&amp;elektra=docs&amp;storm=top-video">Intro to Kibana: Video</a></li>
                        <li class="icon-logstash-white"><a href="https://www.elastic.co/webinars/introduction-elk-stack?baymax=default&amp;elektra=docs&amp;storm=top-video">ELK for Logs &amp; Metrics: Video</a></li>
                      </ul>
                    </div>
                  </div>
                </div>
              </div>
            </div>
          </section>

        </div>


<div id="elastic-footer"></div>
<script src="https://www.elastic.co/elastic-footer.js"></script>
<!-- Footer Section end-->

      </section>
    </div>

<script src="/guide/static/jquery.js"></script>
<script type="text/javascript" src="/guide/static/docs.js"></script>
<script type="text/javascript">
  window.initial_state = {}</script>
  </body>
</html>
